#pragma once
#include <fstream>
#include <memory>

#include <mysql/jdbc.h>
#include <json/json.h>


class stack_chat_db {
public:
	typedef sql::Connection* connect_ptr;
	typedef sql::Driver* driver_ptr;
protected:
	connect_ptr con;
	driver_ptr driver;
public:
	stack_chat_db();
	~stack_chat_db();
	void printDriverInfo();
	void printConnectInfo();


	int userSearchByID(const int& id);
	std::string userGetNameByID(const int& id);
	std::string userGetPasswordByID(const int& id);
	int userUpdateNameByID(const int& id, const std::string& name);
	int userUpdatePasswordByID(const int& id, const std::string& password);
	int userDeleteByID(const int& id);
	int userInsert(const int& id, const std::string& name, const std::string& password);


	struct user_info
	{
		int id, age;
		std::string sex, info, email, phone, gtime;
	};
	int user_infoSearchByID(const int& id);
	int user_infoInsert(const user_info& uf);
	int user_infoDeleteByID(const int& id);
	int user_infoUpdateByID(const user_info& uf);
	user_info user_infoGetInfoByID(const int& id);



	struct server_log
	{
		int id, level;
		std::string data, time;
	};
	int server_logSearchByID(const int& id);
	int server_logInsert(const server_log& sl);
	int server_logDeleteByID(const int& id);
	int server_logUpdateByID(const server_log& sl);
	server_log server_logGetLogByID(const int& id);



	struct message_log
	{
		int id, send_id, receive_id, status;
		std::string data, time;
	};
	int message_logSearchByID(const int& id);
	std::string message_logGetMessageByUserID(const int& id);
	int message_logInsert(const message_log& ml);


	struct friend_table
	{
		int friend_id, user_id_a, user_id_b;
		std::string friend_time;
	};
	int friend_tableSearchByID(const int& id);
	std::string friend_tableGetFriendsByUserID(const int& id);
	int friend_tableIsFriend(const int& ida, const int& idb);
	int friend_tableDeleteByUserID(const int& ida, const int& idb);
	int friend_tableInsert(const friend_table& ft);

	void test()
	{
		std::cout << con->getClientInfo() << std::endl;
		std::cout << con->getSchema() << std::endl;
	}
};